﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sauces.Bussinees.Entities.Caja;
using Sauces.Repository.Caja.Service;

namespace Sauces.Repository.Caja
{
   public class FacturaRepository:MasterRepository,IFacturaRepository
    {
        public List<Factura> getAllFactura()
        {
            var query = from p in Context.Factura.Include("Cliente")
                        select p;

            return query.ToList();
        }       

        public Factura getAllFacturaByNumero(int numero)
        {
            throw new NotImplementedException();
        }

        public Factura getFromFacturaById(int id)
        {
            var query = from p in Context.Factura.Include("DetalleFactura.Producto").Include("Cliente")
                        where p.Id.Equals(id)
                        select p;

            return query.SingleOrDefault();
        }

        public void addFactura(Factura factura)
        {            
            Context.Entry(factura.Cliente).State = System.Data.EntityState.Unchanged;

            foreach (var detalle in factura.DetalleFactura)
            {
                Context.Entry(detalle.Producto).State = System.Data.EntityState.Unchanged;
                
            }
            Context.Factura.Add(factura);
            Context.SaveChanges();
        }

        public void upDateFactura(Factura factura)
        {
            var facturaDB = getFromFacturaById(factura.Id);

            facturaDB.Fecha = factura.Fecha;
            facturaDB.Total = factura.Total;
            facturaDB.SubTotal = factura.SubTotal;
            facturaDB.Igv = factura.Igv;
            

            if (facturaDB.IdCliente != factura.IdCliente)
            {
                facturaDB.IdCliente = factura.IdCliente;
                facturaDB.Cliente = factura.Cliente;
                Context.Entry(facturaDB.Cliente).State = System.Data.EntityState.Unchanged;
 
            }
            

            var DetallesEliminados = new List<DetalleFactura>();

            foreach (var detalleBD in facturaDB.DetalleFactura)
            {
                var eliminado = factura.DetalleFactura.Where(dp => dp.item == detalleBD.item).SingleOrDefault();

                if (eliminado == null)
                {
                    DetallesEliminados.Add(detalleBD);
                }
            }

            foreach (var detEliminado in DetallesEliminados)
            {
                var eliminar = facturaDB.DetalleFactura.Where(dp => dp.item == detEliminado.item).SingleOrDefault();
                facturaDB.DetalleFactura.Remove(eliminar);
            }

            foreach (var detalle in factura.DetalleFactura)
            {
                if (detalle.item == 0)
                {
                    Context.Entry(detalle.Producto).State = System.Data.EntityState.Unchanged;
                    facturaDB.DetalleFactura.Add(detalle);
                }

                else
                {
                    var detalleDB = facturaDB.DetalleFactura.Where(dp => dp.item == detalle.item).SingleOrDefault();
                    detalleDB.Cantidad = detalle.Cantidad;
                    detalleDB.Precio = detalle.Precio;

                    Context.Entry(detalleDB.Producto).State = System.Data.EntityState.Unchanged;
                    Context.Entry(detalleDB).State = System.Data.EntityState.Modified;
                }
            }

            Context.Entry(facturaDB).State = System.Data.EntityState.Modified;
            Context.SaveChanges();
        }
        

        public void removeFactura(int id)
        {
            var factura = getFromFacturaById(id);            

            Context.Factura.Remove(factura);
            Context.SaveChanges();
        }



        public List<Factura> getAllBoletaByNombreAndFechas(string nombre, DateTime? FInicio, DateTime? FFin)
        {
            var query = from p in Context.Factura.Include("Cliente")
                        select p;

            if (nombre != null && nombre != "")
            {
                query = from c in query
                        where c.Cliente.RazonSocial.ToUpper().Contains(nombre.ToUpper())
                        select c;
            }

            else if (FInicio.HasValue && FFin.HasValue)
            {
                query = from p in query
                        where p.Fecha >= FInicio && p.Fecha <= FFin
                        select p;
            }


            return query.ToList();
        }
    }
}
